﻿# -*- coding: utf-8 -*-
"""
实现一个 LRU 缓存类，至少包含 get 和 put 方法
解释：
LRU(Least Recently Used),最近最少使用缓存算法数据结构
使用一个 list 保存最近访问的元素，
get、set 对它进行 key 位置更新，并用字典进行查找元素
"""


class LRU_cache:
    def __init__(self, count=5):
        self.count = count
        self.rank_list = list()
        self.lib_dict = dict()

    def __move_top(self, key):
        if not self.rank_list:
            self.rank_list.append(key)
        elif self.rank_list[0] != key:
            if key in self.lib_dict:
                self.rank_list.remove(key)
            self.rank_list.insert(0, key)

    def get(self, key):
        if key in self.lib_dict:
            self.__move_top(key)
            print('=' * 12, f'查询{key}之后', '=' * 9, sep='')
            print(self)
            print('=' * 30)
            return self.lib_dict[key]
        else:
            print('=' * 12, f'查询{key}', '=' * 13, sep='')
            return 'No Data!!'

    def put(self, key, value):
        self.__move_top(key)
        self.lib_dict[key] = value
        if len(self.rank_list) > self.count:
            self.lib_dict.pop(self.rank_list.pop())
        print('*' * 8, f'放入{(key, value)}之后', '*' * 8, sep='')
        print(self)
        print('*' * 30)

    def __repr__(self):
        print(self.rank_list)
        return str(self.lib_dict)


def run():
    cache = LRU_cache()
    print(cache.get(1))
    cache.put(1, 1)
    cache.put(2, 2)
    cache.put(3, 3)
    print('-------------改变位置了-------')
    cache.put(2, 1)
    cache.put(4, 4)
    cache.put(5, 5)
    print('-------------满了-------------')
    cache.put(6, 6)
    cache.put(7, 7)
    print(cache.get(1))
    print(cache.get(4))
    print(cache.get(3))
    print(cache.get(6))


if __name__ == '__main__':
    run()
